//
// Created by jwhww on 25-9-27.
//

#include "AllHeadFile.h"

/*
 * key.c
 *
 *  Created on: 2025年6月3日
 *      Author: jwhww
 */

#include "key.h"

int pit_CCU60_CH1_state = 0;    //按键中断位

//按键簇
keyStruct key;           //轻触按键实例簇

//------------------------------------------------------------------------------------------------------
// 函数简介     按键检测
// 使用示例     Key_Check(1, &key, LED_1_GPIO_Port, LED_1_Pin);
// 参数介绍     num                             第几个按键
// 参数介绍     *key                            按键簇
// 参数介绍     key_pin                         按键位号
// 返回参数     void
// 备注信息     后续给拨码开关写的时候可以新建另一个结构体；
// 备注信息     改变key[num-1].flag = 1语句的位置可以更改按键的确认模式，在case KEY_COMFIRM里是按下确认，在case KEY_UNPRESSED是松手确认
// 备注信息     单独使用key[num-1].flag的话需要手动置零哦~
//------------------------------------------------------------------------------------------------------
void Key_Check(int num, keyStruct *key_instance, GPIO_TypeDef *GPIO_port, uint16_t key_gpio_pin){
    switch (key_instance[num-1].state){

        case KEY_CHECK:
            //读到低电平，进入按键确认状态
            if(HAL_GPIO_ReadPin(GPIO_port, key_gpio_pin) == GPIO_PIN_RESET){
                key_instance[num-1].state = KEY_COMFIRM;
            }
            break;

        case KEY_COMFIRM:
            //中断时间内再读到一次低电平，才确认是按键按下（防误触）， 进入释放状态
            if(HAL_GPIO_ReadPin(GPIO_port, key_gpio_pin) == GPIO_PIN_RESET){
                key_instance[num-1].state = KEY_UNPRESSED;
                //按下确认(未开启）
//                key[num-1].flag = 1;
            } else {
                //第二次如果读到高电平，那认为干扰信号或者误触，返回初始状态
                key_instance[num-1].state = KEY_CHECK;
            }
            break;

        case KEY_UNPRESSED:
            //读到高电平，说明按键释放，返回初始状态
            if (HAL_GPIO_ReadPin(GPIO_port, key_gpio_pin) == GPIO_PIN_SET){
                key_instance[num-1].state = KEY_CHECK;
                //松手确认
                key_instance[num-1].flag = 1;
            }

        default:
            break;
    }
}

//------------------------------------------------------------------------------------------------------
// 函数简介     按键检测大全
// 使用示例     Key_Check_All();
// 返回参数     void
// 备注信息
// 备注信息
//------------------------------------------------------------------------------------------------------
void Key_Check_All(void){
    //按钮轮询
        Key_Check(1, &key, KEY_GPIO_Port, KEY_Pin);
}

//------------------------------------------------------------------------------------------------------
// 函数简介     按键处理
// 使用示例     Key_1_Job();
// 返回参数     void
// 备注信息     按下按键处理的函数写在这里
// 按键4
// 按键3
// 按键2
// 按键1       亮一下小灯
// 编码器旋钮    小转一下轮子
//------------------------------------------------------------------------------------------------------
uint8_t state_key_1 = 0;
//亮一下小灯，并改变角度
void Key_1_Job (void){
    if (key.flag == 1){
        state_key_1++;
        state_key_1 %= 2;
        //单次点击触发的功能↓↓↓
        HAL_GPIO_TogglePin(LED_Red_GPIO_Port, LED_Red_Pin);
        keyCtrl_target_position += 2048;
        keyCtrl_target_position %= 8192;
        // monitor_target = (monitor_target += 2048) % 8192;       //C 语言标准规定：在两个序列点之间对同一个变量既读又写，顺序未定义。触发了编译器的 -Wsequence-point 警告。

        //单次点击触发的功能↑↑↑
        key.flag = 0;
    }
    //按下和不按的功能（切换控制）
    if (state_key_1 == 1){

    } else {

    }
}



